"""
装饰器语法 - 使用装饰器定义布局块
使用方式：@布局块(界面)
"""

from ..核心 import _布局上下文, 创建主窗口, 为窗口设置中央区域和布局
from ..核心 import 应用全局样式, 简单居中窗口
from functools import wraps


class 布局块:
    """布局块装饰器"""

    def __init__(self, 上下文):
        self.上下文 = 上下文

    def __call__(self, func):
        @wraps(func)
        def 包装器(*args, **kwargs):
            with self.上下文:
                return func(*args, **kwargs)

        return 包装器


class 界面装饰器:
    """界面装饰器管理器"""

    def __init__(self, 标题="我的应用", 宽度=600, 高度=400):
        self.窗口 = 创建主窗口(标题, 宽度, 高度)
        中央区域, 布局 = 为窗口设置中央区域和布局(self.窗口)
        self.上下文 = _布局上下文(布局)
        self.样式配置 = {}

    def 设置样式(self, 背景颜色="#F0F0F0", 字体="微软雅黑", 字号=12):
        """设置全局样式"""
        self.样式配置 = {"背景颜色": 背景颜色, "字体": 字体, "字号": 字号}
        return self

    def 应用样式(self):
        """应用全局样式"""
        if self.样式配置:
            应用全局样式(self.窗口, **self.样式配置)

    def 居中(self):
        """居中窗口"""
        简单居中窗口(self.窗口)
        return self

    def 显示(self):
        """显示窗口"""
        self.窗口.show()
        return self

    def 获取窗口(self):
        """获取窗口对象"""
        return self.窗口

    def 获取上下文(self):
        """获取上下文对象"""
        return self.上下文

    def 布局块(self, 上下文=None):
        """创建布局块装饰器"""
        目标上下文 = 上下文 or self.上下文
        return 布局块(目标上下文)


def 创建装饰界面(标题="我的应用", 宽度=600, 高度=400):
    """创建装饰器界面"""
    return 界面装饰器(标题, 宽度, 高度)


# 快捷函数
def 布局块(上下文):
    """创建布局块装饰器"""
    return 布局块(上下文)


# 使用示例
def 示例应用():
    """装饰器语法的使用示例"""
    界面 = 创建装饰界面("装饰器语法示例", 800, 600)
    界面.设置样式(背景颜色="#F5F5F7")

    主布局 = 界面.获取上下文()
    卡片布局 = 主布局.阴影框(背景颜色="#FFFFFF", 圆角=8)

    @布局块(主布局)
    def 添加标题():
        主布局.标签("装饰器语法示例", 字体大小="24px", 字体粗细="bold")

    @布局块(主布局.水平布局(内边距=10))
    def 添加控制栏():
        主布局.输入框("请输入内容")
        主布局.按钮("提交", lambda: print("提交点击"))

    @布局块(卡片布局)
    def 添加卡片内容():
        卡片布局.标签("卡片标题")
        卡片布局.输入框("卡片输入")
        卡片布局.按钮("卡片按钮")

    界面.应用样式()
    界面.居中()
    界面.显示()

    return 界面.获取窗口()


__all__ = [
    '布局块',
    '界面装饰器',
    '创建装饰界面',
    '示例应用'
]